package com.org.shichui.websocket;

import com.alibaba.fastjson.JSONObject;
import com.org.shichui.common.MesType;
import com.org.shichui.common.SocketMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * @author: zhangzeli
 * @date 11:46 2018/8/1
 * <P></P>
 */
@ServerEndpoint(value = "/socketServer/{userid}")
@Component
public class SocketServer {

    private static final Logger logger = LoggerFactory.getLogger(SocketServer.class);

    private Session session;
    private static Map<String,Session> sessionPool = new HashMap<>();
    private static Map<String,String> sessionIds = new HashMap<>();

    /**
     * 客户端初次连接的时候出发,这里会为客户端创建一个session,这个session并不是我们熟悉的httpsession,
     * 同事我们会将客户端传来的唯一标示与该session绑定,并且保存我们定义的静态map里面,以便后续给指定客户端发送消息
     * @param session
     * @param userid
     */
    @OnOpen
    public void open(Session session,@PathParam(value="userid")String userid){
        this.session = session;
        sessionPool.put(userid, session);
        sessionIds.put(session.getId(), userid);
        logger.debug("用户:{}连接成功",userid);
    }

    /**
     * 在客户端与服务端发送消息的时候触发,接收到来自客户端的消息
     * @param message
     */
    @OnMessage
    public void onMessage(String message){
        logger.debug("当前发送人sessionid为"+session.getId()+"发送内容为:"+message);
        SocketMessage socketMessage = JSONObject.parseObject(message, SocketMessage.class);
        if(socketMessage.getMessage()== MesType.REG){
            logger.debug("注册啊");
        }
    }

    /**
     * 使用该注解,在客户端与服务端断开连接的时候触发,同时我们会将静态map.里面存的关于此客户端的session移除掉
     */
    @OnClose
    public void onClose(){
        sessionPool.remove(sessionIds.get(session.getId()));
        sessionIds.remove(session.getId());
    }

    /**
     * 使用该注解,在发生错误时触发
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }

    /**
     * 发送消息,根据客户端的唯一标示与要发送给客户端的消息进行对客户端的定向发送
     * @param message
     * @param userId
     */
    public static void sendMessage(String message,String userId){
        Session s = sessionPool.get(userId);
        if(s!=null){
            try {
                s.getBasicRemote().sendText(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取在线人数
     * @return
     */
    public static int getOnlineNum(){
        return sessionPool.size();
    }

    /**
     * 获取所有用户
     * @return
     */
    public static String getOnlineUsers(){
        StringBuffer users = new StringBuffer();
        for (String key : sessionIds.keySet()) {
            users.append(sessionIds.get(key)+",");
        }
        return users.toString();
    }

    /**
     * 群发
     * @param msg
     */
    public static void sendAll(String msg) {
        for (String key : sessionIds.keySet()) {
            sendMessage(msg, sessionIds.get(key));
        }
    }
}
